{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3efc4088",
   "metadata": {},
   "source": [
    "# Центральная предельная теорема"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a14da94a",
   "metadata": {},
   "source": [
    "Центральные предельные теоремы (ЦПТ) — класс теорем в теории вероятностей, утверждающих, \n",
    "что сумма достаточно большого количества слабо зависимых случайных величин, имеющих примерно \n",
    "одинаковые масштабы (ни одно из слагаемых не доминирует, не вносит в сумму определяющего вклада), \n",
    "имеет распределение, близкое к нормальному."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d50dcfb",
   "metadata": {},
   "source": [
    "# Пример "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "cd22096e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from statistics import multimode\n",
    "\n",
    "import numpy as np\n",
    "import scipy.stats as sps\n",
    "import matplotlib.pyplot as plt\n",
    "import PyPDF2\n",
    "import re\n",
    "\n",
    "from collections import Counter\n",
    "from collections import OrderedDict\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f227cd9",
   "metadata": {},
   "source": [
    "Создаем функцию для извлечения информации из PDF файла с непрерывными случайными величинами. Далее будем действовать по методике Extract Load Transform (ETL)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "752c1146",
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_from_pdf(variant):\n",
    "    \n",
    "    reader = PyPDF2.PdfReader('datasets/Непрерывные величны, практикум 1.pdf')\n",
    "    message = 'Вариант '\n",
    "    variant = f'Вариант {V}'\n",
    "    \n",
    "    for i in range(len(reader.pages)):\n",
    "    \n",
    "        text = reader.pages[i].extract_text()\n",
    "    \n",
    "        if variant in text:\n",
    "            \n",
    "            index = text.index(str(V))\n",
    "            end = index\n",
    "            \n",
    "            while not end == len(text) and not text[end] == 'В':\n",
    "                message += text[end]\n",
    "                end += 1\n",
    "                \n",
    "            return message"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6fa652eb",
   "metadata": {},
   "source": [
    "Функция для загрузки параметров из текста, возвращает пару μ и σ_square"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "186a2595",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_parameters(message):\n",
    "    \n",
    "    parameters = re.findall(r'\\w+', message)\n",
    "    \n",
    "    μ = int(parameters[-2])\n",
    "    σ_square = int(parameters[-1])\n",
    "    \n",
    "    return (μ, np.sqrt(σ_square))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f717015c",
   "metadata": {},
   "source": [
    "Функция для трансформации μ и σ_square в нормальное распределение"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "74f6fe52",
   "metadata": {},
   "outputs": [],
   "source": [
    "def transform_to_distribution(μ, σ_square, size):\n",
    "    return sps.norm.rvs(size = size, loc = μ, scale = σ_square)\n",
    "\n",
    "def bins(distribution, bin_count):\n",
    "    \n",
    "    bins = np.linspace(min(distribution), max(distribution), num = bin_count)\n",
    "            \n",
    "    counter = Counter(np.digitize(distribution, bins))\n",
    "    oredered = OrderedDict(sorted(counter.items(), key = lambda t: t[0]))\n",
    "        \n",
    "    data = dict.fromkeys(bins, 0)\n",
    "\n",
    "    for key, count in oredered.items():\n",
    "        data[bins[key - 1]] = count\n",
    "        \n",
    "    return data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "630d5e72",
   "metadata": {},
   "source": [
    "Задаем начальные параметры"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c477fc86",
   "metadata": {},
   "outputs": [],
   "source": [
    "V = 10 # номер варианта\n",
    "N = 1_000 # количество экспериментов\n",
    "bin_count = 100 # количество интервалов\n",
    "size = 100 # размер каждой выборки"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "787ee619",
   "metadata": {},
   "source": [
    "Достаем текст по варианту, загружаем из текста параметры распределения, создаем N распределений и суммируем по кол-ву вхождений \n",
    "в интервалы"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "218ad51a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Вариант 10\n",
      "X распределен по закону N(2, 1)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "message = extract_from_pdf(V)\n",
    "print(message)\n",
    "\n",
    "μ, σ = load_parameters(message)\n",
    "\n",
    "def culc(variant, N, bin_count, size):\n",
    "    \n",
    "    summary = []\n",
    "\n",
    "    for i in range(N):\n",
    "        data = transform_to_distribution(μ, σ, size = size)\n",
    "        summary.extend(list(data))\n",
    "\n",
    "    data = bins(summary, bin_count)\n",
    "\n",
    "    keys = data.keys()\n",
    "    values = np.array(list(data.values()))\n",
    "    values = values / values.sum() * bin_count / (max(keys) - min(keys))\n",
    "    \n",
    "    return keys, values\n",
    "    \n",
    "keys, values = culc(V, N, bin_count, size)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73df14d1",
   "metadata": {},
   "source": [
    "Выводим наше суммарное распределение и нормальное с теми же параметрами, не забываем разделить первое на сумму всех значений чтобы свести площадь к единице"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e241b805",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(min(keys), max(keys), bin_count)\n",
    "\n",
    "norm = sps.norm.pdf(x_axis, μ, σ)\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(keys, norm, color = 'blue')\n",
    "\n",
    "plt.plot(x_axis, values, color = 'red')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb68bcf1",
   "metadata": {},
   "source": [
    "Выполним двухвыборочный критерий Колмогорова-Смирнова на соответствие. Нулевая гипотеза состоит в том, что два распределения идентичны."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5b8ae209",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KstestResult(statistic=0.12, pvalue=0.469506448503778, statistic_location=0.0, statistic_sign=-1)\n",
      "KstestResult(statistic=0.09, pvalue=0.8154147124661313, statistic_location=0.0, statistic_sign=-1)\n",
      "KstestResult(statistic=0.06, pvalue=0.9942356257694902, statistic_location=3.700908135862478e-05, statistic_sign=-1)\n",
      "KstestResult(statistic=0.1, pvalue=0.7020569828664881, statistic_location=5.2940121376994994e-05, statistic_sign=-1)\n",
      "KstestResult(statistic=0.1, pvalue=0.7020569828664881, statistic_location=6.392012645425924e-05, statistic_sign=-1)\n"
     ]
    }
   ],
   "source": [
    "for i in range(1, 6):\n",
    "    \n",
    "    experimental = culc(V, N * i, bin_count, size)[1]\n",
    "    print(sps.kstest(norm, experimental))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fddd88e7",
   "metadata": {},
   "source": [
    "<strong>Вывод:</strong> как мы видим, два распределения очень похожи, и на больших объемах они все ближе и ближе. P-value > 0.05, значит что мы имеем вероятность 5-95% того, что эти распределения идентичны."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
